package com.abc.aop02;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

//类为切面类
public class MyAspect {
    //前置通知
   public void myBefore(){
       System.out.println("执行前置通知方法");
   }

    //前置通知
    public void myBefore(JoinPoint jp){
        System.out.println("执行前置通知方法jp="+jp);
    }

    //后置通知
    public void myAferReturning(){
        System.out.println("执行后置通知方法");
    }

    //后置通知,可以获取目标方法的执行结果（返回值）
    public void myAferReturning(Object result){
        System.out.println("执行后置通知方法retult"+result);
    }

    //环绕通知，不仅可以获取目标方法的执行结果（返回值），还可以改变其值
    public Object myAround(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("执行环绕通知--目标方法执行之前");
        //执行目标方法
        Object proceed = pjp.proceed();
        System.out.println("执行环绕通知--目标方法执行之前");
        //改变目标方法的返回值
        if(proceed!=null){
            proceed = ((String)proceed).toUpperCase();
        }

        return proceed;
    }

    //异常通知
    public void myThrowing(){
        System.out.println("执行异常通知方法");
    }

    //异常通知
    public void myThrowing(Exception ex){
        System.out.println("执行异常通知方法"+ex.getMessage());
    }

    //最终通知:无论是否发生异常都会执行的方法
    public void myAfter(){
        System.out.println("执行最终通知方法");
    }

}
